package com.qvtu.springboot.controller;

import cn.hutool.core.io.FileUtil;
import com.qvtu.springboot.Common.Result;
import com.qvtu.springboot.exception.CustomException;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//文件上传的接口
@RestController
//这里不使用file 是为了避免和java类file冲突
@RequestMapping("/files")
public class FileController {

//    System.getProperty("user.dir") 获取到当前这个项目的根路径
//    文件上传的目录的路径
    private static final String filePath=System.getProperty("user.dir")+"/files/";

//    文件上传
    @PostMapping("/upload")
    public Result upload(MultipartFile file){ //文件流的形式接收前端发送过来的文件
        String originalFilename=file.getOriginalFilename();//获取到文件原始名称
//        设置文件上传的地址 （跟随系统项目的路径）
        if(FileUtil.isDirectory(filePath)){
//            如果文件不存在 需要先创建目录
            FileUtil.mkdir(filePath);
        }
//        提供文件完整的路径
        String fileName=System.currentTimeMillis()+originalFilename; //生成新的文件名（时间戳+原始文件名） 是为了避免上传文件的时候文件名冲突
        String realPath=filePath+fileName;//完整的文件路径
        try {
            //        将文件写入到某磁盘下
            FileUtil.writeBytes(file.getBytes(),realPath);
        } catch (IOException e) {
            e.printStackTrace();
            throw new CustomException("500","文件上传失败");
        }
//        返回一个网络链接 http://localhost；8080/files/download/xxx.jpg
        String url="http://localhost:8080/files/download/"+fileName;//生成文件下载链接
        return Result.success(url);
    }

//    文件下载 (不同的文件名可能在下载的时候会出现编码错误)
    @GetMapping("/download/{fileName}")  //在浏览器中输入http://localhost:8080/files/download/文件名 回车下载文件
    public void download(@PathVariable String fileName, HttpServletResponse response){
//        httpServletResponse 可以通过流的方式将文件传给客户端
        try {
//            设置统一编码 （设置Content-Disposition,指定文件下载的文文件名 并对文件名进行URL编码 避免文件名包含特殊字符或中文时出现乱码）
            response.addHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
//            设置Content-Type为application/octet-stream 表示返回的是二进制流
            response.setContentType("application/octet-stream");
//            读取文件内容
            OutputStream os = response.getOutputStream();
//            获取到文件的字节数组
            String realPath=filePath+fileName;//完整的文件路径
            byte[] bytes = FileUtil.readBytes(realPath);
//            将文件内容写入到响应的输出流中
            os.write(bytes);
            os.close();
        } catch (IOException e) {
            throw new CustomException("500","文件下载失败");
        }
    }

//    wang-editor编辑器文件上传接口  下次使用可直接复制
    @PostMapping("/wang/upload")
    public Map<String,Object> wangEditorUpload(MultipartFile file){
        String originalFilename=file.getOriginalFilename();//获取到文件原始名称
//        设置文件上传的地址 （跟随系统项目的路径）
        if(FileUtil.isDirectory(filePath)){
//            如果文件不存在 需要先创建目录
            FileUtil.mkdir(filePath);
        }
//        提供文件完整的路径
        String fileName=System.currentTimeMillis()+originalFilename; //生成新的文件名（时间戳+原始文件名） 是为了避免上传文件的时候文件名冲突
        String realPath=filePath+fileName;//完整的文件路径
        try {
            //        将文件写入到某磁盘下
            FileUtil.writeBytes(file.getBytes(),realPath);
        } catch (IOException e) {
            e.printStackTrace();
            throw new CustomException("500","文件上传失败");
        }
        //        返回一个网络链接 http://localhost；8080/files/download/xxx.jpg
        String url="http://localhost:8080/files/download/"+fileName;//生成文件下载链接
//        wangEditor上传图片失败后 需要返回的参数
        Map<String,Object> resMap=new HashMap<>();
        List<Map<String,Object>> list=new ArrayList<>();
        Map<String,Object> urlMap=new HashMap<>();
        urlMap.put("url",url);
        list.add(urlMap);
        resMap.put("errno",0);
        resMap.put("data",list);
        return resMap;
    }
}
